<?php
/** 
 * @author felipe
 * 
 * 
 */
class App_Model_DistribuicaoMapper extends Voitech_Mapper{
	
    
        public function __construct(App_Model_Distribuicao $obModel){
            $this->obModel = $obModel;
        }
        	
	/**
	 * Metodo para buscar uma Distribuicao
	 * @param int $coDistribuicao
	 * @return App_Model_Distribuicao
	 */
	public function buscarPorId() {
            $rowDistribuicao = App_Model_Db_Distribuicao::build()->buscarDistribuicao( $this->obModel->getCoDistribuicao() );
            if( empty( $rowDistribuicao ) )
            {
                    return $rowDistribuicao;
            }	
            $this->carregar($rowDistribuicao);
            return $this;
        }
        
        public function carregar(stdClass $rowDistribuicao){
            //Zend_Debug::dump($rowDistribuicao);exit;
            $this->obModel->setCoDistribuicao($rowDistribuicao->co_distribuicao);
            $this->obModel->setDtDistribuicao($rowDistribuicao->dt_cadastro);
        
            $arItemDistribuicao = App_Model_Db_ItemDistribuicao::build()->listarTodos(new Voitech_TO(array('co_distribuicao'=>$rowDistribuicao->co_distribuicao,'st_ativo'=>'S')));

            foreach($arItemDistribuicao as $rowItem) {
                $obProduto = new App_Model_Produto();
                $obProduto->setCoProduto($rowItem->co_produto);
                $obProduto->setNoProduto($rowItem->no_produto);

                $obCategoria = new App_Model_Categoria();
                $obCategoria->setCoCategoria($rowItem->co_categoria);
                $obCategoria->setNoCategoria($rowItem->no_categoria);
                $obProduto->setObCategoria($obCategoria);
                
                $obTipoProduto = new App_Model_TipoProduto();
                $obTipoProduto->setCoTipoProduto($rowItem->co_tipo_produto);
                $obTipoProduto->setNoTipoProduto($rowItem->no_tipo_produto);
                

                $obProduto->setObTipoProduto($obTipoProduto);

                $obItemDistribuicao = new App_Model_ItemDistribuicao();
                $obItemDistribuicao->setObProduto($obProduto);
                $obItemDistribuicao->setNuQuantidadeSolicitada($rowItem->nu_quantidade_solicitada);
                $obItemDistribuicao->setNuQuantidadeAtendida($rowItem->nu_quantidade_atendida);

                $this->obModel->adicionarItemDistribuicao($obItemDistribuicao);
            }

            $obUnidade = new App_Model_Unidade();
            $obUnidade->setCoUnidade($rowDistribuicao->co_unidade);
            $obUnidade->setNoUnidade($rowDistribuicao->no_unidade);
            $obUnidade->setCoTipoUnidade($rowDistribuicao->co_tipo_unidade);
            $obUnidade->setDsEndereco($rowDistribuicao->ds_endereco);
            $obUnidade->setNuTelefone($rowDistribuicao->nu_telefone);

            $obResponsavel = new App_Model_Responsavel();
            $obResponsavel->setCoPessoa($rowDistribuicao->co_responsavel);
            $obResponsavel->setNoPessoa($rowDistribuicao->no_responsavel);
            $obResponsavel->setNuCpf($rowDistribuicao->nu_cpf_responsavel);

            $obUnidade->setObResponsavel( $obResponsavel );

            $obUsuario = new App_Model_Usuario();
            $obUsuario->setCoPessoa($rowDistribuicao->co_usuario);
            $obUsuario->setNoPessoa($rowDistribuicao->no_usuario);
            $obUsuario->setNuCpf($rowDistribuicao->nu_cpf_usuario);

            $this->obModel->fecharDistribuicao($obUnidade, $obUsuario);
            
            return $this;
	}
	
	/**
	 * Metodo que insere/altera uma Distribuicao
	 * 
	 * @param  App_Model_Distribuicao $this->obModel
	 * @return void
	 */
	public function cadastrar() {
            $arrDistribuicao = $this->retornarArrayPopulado();
            $this->obModel->setCoDistribuicao(App_Model_Db_Distribuicao::build()->insert($arrDistribuicao));
            $arrItemDistribuicao = $this->obModel->getArItemDistribuicao();
            foreach($arrItemDistribuicao as $obItemDistribuicao) {
                $obItemDistribuicaoMapper = new App_Model_ItemDistribuicaoMapper($obItemDistribuicao,$this->obModel->getCoDistribuicao());
                $obItemDistribuicaoMapper->cadastrar();
            }
            return $this;
	}
        
        public function alterar(){
            App_Model_Db_Distribuicao::build()->update($this->retornarArrayPopulado()
					       ,array('co_Distribuicao = ?' => $this->obModel->getCoDistribuicao()));
            // busca o itens ativos para esta Distribuicao
            $obItemDistribuicaoRepository = new App_Model_ItemDistribuicaoRepository();
            $arrObItemDistribuicaoExistente = $obItemDistribuicaoRepository->listarTodosAtivosPorDistribuicao($this->getCoDistribuicao());
            $arrProdutoExistente = array();
            foreach($arrObItemDistribuicaoExistente as $obItemDistribuicao){
                $arrProdutoExistente[$obItemDistribuicao->getObProduto()->getCoProduto()] = $obItemDistribuicao;
            }
            
            $arItemDistribuicao = $this->obModel->getArItemDistribuicao();
            foreach($arItemDistribuicao as $obItemDistribuicao) {
                //verifica se o item que veio do formulario existe na lista atual
                if( in_array($obItemDistribuicao->getObProduto()->getCoProduto(),$arrProdutoExistente))
                {
                    $obItemDistribuicaoMapper = new App_Model_ItemDistribuicaoMapper($obItemDistribuicao,$this->obModel->getCoDistribuicao());
                    $obItemDistribuicaoMapper->alterar();
                    //remove o item que ja foi alterado
                    unset($arrProdutoExistente[$obItemDistribuicao->getObProduto()->getCoProduto()]);
                }
            }	
            
            //verifica se algum item foi excluido da lista de Distribuicao
            if( !empty($arrProdutoExistente) ){
                //desativa os itens que não vieram do formulario
                foreach($arrProdutoExistente as $obItemDistribuicao){
                    $obItemDistribuicaoMapper = new App_Model_ItemDistribuicaoMapper($obItemDistribuicao,$this->obModel->getCoDistribuicao());
                    $obItemDistribuicaoMapper->desativar();
                }
            }            
        }   
	
	/**
	 * Metodo que exclui uma Distribuicao
	 * @param App_Model_Distribuicao $this->obModel
	 */
	public function ativar() {
            App_Model_Db_Distribuicao::build()->udpate(array('st_ativo'=>'N')
                                               ,array('co_distribuicao = ?'=> $this->obModel->getCoDistribuicao()));
	}	
        
        public function desativar(){
            App_Model_Db_Distribuicao::build()->udpate(array('st_ativo'=>'N')
                                               ,array('co_distribuicao = ?'=> $this->obModel->getCoDistribuicao()));
        }
        
        public function retornarArrayPopulado() {
            $arrDistribuicao = array('co_unidade'=>$this->obModel->getObUnidade()->getCoUnidade()
                                    ,'co_pessoa'=>$this->obModel->getObUsuario()->getCoPessoa());
            return $arrDistribuicao;
        }
}